﻿using System.Security.Principal;
using DomainModel;
using Services.Abstract;

namespace Services.Concrete
{
    public class PermissionService : IPermissionService
    {
        private readonly IPrincipal _user;
        public IUserService UserService;

        public PermissionService(IPrincipal user, IUserService userService)
        {
            _user = user;
            UserService = userService;
        }

        #region IPermissionService Members

        public bool CanCUDSubjects()
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (!_user.IsInRole(Role.TrainingDivisionWorker.ToString()) && !_user.IsInRole(Role.Admin.ToString()))
                return false;

            return true;
        }

        public bool CanCUDSemesters()
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (!_user.IsInRole(Role.TrainingDivisionWorker.ToString()) && !_user.IsInRole(Role.Admin.ToString()))
                return false;

            return true;
        }

        public bool CanCUDRings()
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (!_user.IsInRole(Role.TrainingDivisionWorker.ToString()) && !_user.IsInRole(Role.Admin.ToString()))
                return false;

            return true;
        }

        public bool CanChangeMark(Lesson lesson)
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (!_user.IsInRole(Role.Teacher.ToString()))
                return false;

            User currentUser = UserService.GetUserByLogin(_user.Identity.Name);

            if (lesson.TimetableUnit.Teacher.Id != currentUser.Id)
                return false;

            return true;
        }

        public bool CanViewJournal()
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (!_user.IsInRole(Role.Teacher.ToString()) && !_user.IsInRole(Role.TrainingDivisionWorker.ToString()) &&
                !_user.IsInRole(Role.Admin.ToString()))
                return false;

            return true;
        }

        public bool CanCUDTimetableUnits()
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (!_user.IsInRole(Role.Teacher.ToString()) && !_user.IsInRole(Role.TrainingDivisionWorker.ToString()) &&
                !_user.IsInRole(Role.Admin.ToString()))
                return false;

            return true;
        }

        public bool CanCUDTimetableUnit(TimetableUnit timetableUnit)
        {
            if (CanCUDTimetableUnits())
            {
                if (_user.IsInRole(Role.TrainingDivisionWorker.ToString()) || _user.IsInRole(Role.Admin.ToString()))
                    return true;

                if (_user.IsInRole(Role.Teacher.ToString()))
                {
                    User currentUser = UserService.GetUserByLogin(_user.Identity.Name);

                    if (timetableUnit.Teacher.Id == currentUser.Id && timetableUnit.WorkType == WorkType.Consultation)
                        return true;
                }
            }

            return false;
        }

        public bool CanCUDGroups()
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (!_user.IsInRole(Role.TrainingDivisionWorker.ToString()) && !_user.IsInRole(Role.Admin.ToString()))
                return false;

            return true;
        }

        public bool CanChangePraepostor(Group group)
        {
            if (CanCUDGroups())
                return true;

            if (_user.IsInRole(Role.Teacher.ToString()))
            {
                User currentUser = UserService.GetUserByLogin(_user.Identity.Name);

                if (group.Curator != null && group.Curator.Id == currentUser.Id)
                    return true;
            }

            return false;
        }

        public bool CanApproveUser(User userToApprove)
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            // админ может подтверждать регистрацию всех пользователей
            if (_user.IsInRole(Role.Admin.ToString()))
                return true;

            // работник учебного отдела может подтверждать регистрацию преподавателей, учеников, родителей, и других рбу
            if (_user.IsInRole(Role.TrainingDivisionWorker.ToString()))
            {
                if (userToApprove.Role != Role.Admin)
                    return true;
            }

            // преподаватель может подтверждать регистрацию только тех учеников, которые указали группу, где проподаватель - куратор,
            // и их родителей
            if (_user.IsInRole(Role.Teacher.ToString()))
            {
                User currentUser = UserService.GetUserByLogin(_user.Identity.Name);
                if (userToApprove.Role == Role.Student)
                {
                    if (userToApprove.Group.Curator != null && userToApprove.Group.Curator.Id == currentUser.Id)
                        return true;
                }

                if (userToApprove.Role == Role.Parent)
                {
                    if (userToApprove.Child.Group.Curator != null && userToApprove.Child.Group.Curator.Id == currentUser.Id)
                        return true;
                }
            }

            return false;
        }

        public bool CanViewDaybook(User user)
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (_user.IsInRole(Role.Teacher.ToString()) || _user.IsInRole(Role.TrainingDivisionWorker.ToString()) ||
                _user.IsInRole(Role.Admin.ToString()))
                return true;

            User currentUser = UserService.GetUserByLogin(_user.Identity.Name);
            if (_user.IsInRole(Role.Student.ToString()) && currentUser.Id == user.Id)
                return true;

            if (_user.IsInRole(Role.Parent.ToString()) && currentUser.Child.Id == user.Id)
                return true;

            return false;
        }

        public bool CanViewAnyDaybook()
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            if (_user.IsInRole(Role.Teacher.ToString()) || _user.IsInRole(Role.TrainingDivisionWorker.ToString()) ||
                _user.IsInRole(Role.Admin.ToString()))
                return true;

            return false;
        }

        public bool CanChangeProfile(User user)
        {
            if (!_user.Identity.IsAuthenticated)
                return false;

            User currentUser = UserService.GetUserByLogin(_user.Identity.Name);
            return currentUser.Id == user.Id;
        }

        #endregion
    }
}